//package cn.xzqwjw.taskmanager.security.filter;
//
//import.html org.springframework.social.connect.web.HttpSessionSessionStrategy;
//import.html org.springframework.social.connect.web.SessionStrategy;
//import.html org.springframework.stereotype.Component;
//import.html org.springframework.util.StringUtils;
//import.html org.springframework.web.bind.ServletRequestBindingException;
//import.html org.springframework.web.bind.ServletRequestUtils;
//import.html org.springframework.web.context.request.ServletWebRequest;
//import.html org.springframework.web.filter.OncePerRequestFilter;
//
//import.html javax.servlet.FilterChain;
//import.html javax.servlet.ServletException;
//import.html javax.servlet.http.HttpServletRequest;
//import.html javax.servlet.http.HttpServletResponse;
//import.html java.io.IOException;
//
///*
// * 在 spring 中，filter 都默认继承 OncePerRequestFilter ，但为什么要这样呢？
// * OncePerRequestFilter 能够确保在一次请求只通过一次filter，而不需要重复执行
// * 常识上都认为，一次请求本来就只过一次，为什么还要由此特别限定呢
// * 实际上此方式是为了兼容不同的 web container，特意而为之（jsr168）
// * 也就是说并不是所有的 container 都像我们期望的只过滤一次
// * servlet版本不同，表现也不同。因此，为了兼容各种不同的运行环境和版本
// * 默认 filter 继承 OncePerRequestFilter 是一个比较稳妥的选择
// */
//
///**
// * @author rush
// */
//@Component
//public class ValidateCodeImageFilter extends OncePerRequestFilter {
//
//  private static final String SESSION_KEY = "365345423587654";
//  private final SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();
//  private final ValidateCodeImageFailedHandler validateCodeImageFailedHandler;
//
//  public ValidateCodeImageFilter() {
//    this.validateCodeImageFailedHandler = new ValidateCodeImageFailedHandler();
//  }
//
//  @Override
//  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
//          throws ServletException, IOException {
//    // "/login/login"对应 loginProcessingUrl 设置的 url
//    // if(request.getRequestURI().contains("/login/login"))
//    if ("/api/login".equals(request.getRequestURI()) && "POST".equalsIgnoreCase(
//            request.getMethod())) {
//      try {
//        validate(new ServletWebRequest(request));
//      } catch (ValidateCodeImageException e) {
//        System.out.println("验证图片验证码时出错");
//        validateCodeImageFailedHandler.onAuthenticationFailure(request, response, e);
//        // 不继续执行
//        return;
//      }
//    }
//    // 继续执行下一步
//    filterChain.doFilter(request, response);
//  }
//
//  private void validate(ServletWebRequest request) throws ServletRequestBindingException {
//    System.out.println("开始执行验证验证码");
//    // 从Session中获取imageCode对象
//    VerifyCodeDto verifyCodeDto = (VerifyCodeDto) sessionStrategy.getAttribute(
//            request, SESSION_KEY);
//    String codeInSession = "";
//    if (verifyCodeDto != null) {
//      codeInSession = verifyCodeDto.getText();
//    }
//    System.out.println("从session获取的字符串：" + codeInSession);
//    // 从传过来的表单里获得输入的验证码字符串
//    String codeInRequest = ServletRequestUtils.getStringParameter(
//            request.getRequest(), "imageCode");
//    System.out.println("从表单传过来的字符串：" + codeInRequest);
//    if (StringUtils.isEmpty(codeInRequest)) {
//      System.out.println("纳尼？？？为空");
//      throw new ValidateCodeImageException("验证码为空或者不存在");
//    }
//    if (codeInSession == null || "".equals(codeInSession)) {
//      System.out.println("纳尼？？？不存在");
//      throw new ValidateCodeImageException("验证码不存在，请刷新验证码");
//    }
//    if (verifyCodeDto.isExpired()) {
//      //从 session 移除过期的验证码
//      System.out.println("纳尼？？？过期");
//      sessionStrategy.removeAttribute(request, SESSION_KEY);
//      throw new ValidateCodeImageException("验证码过期");
//    }
//    if (!codeInSession.equalsIgnoreCase(codeInRequest)) {
//      System.out.println("纳尼？？？不匹配");
//      throw new ValidateCodeImageException("验证码不匹配");
//    }
//    // session 中移除key
//    sessionStrategy.removeAttribute(request, SESSION_KEY);
//  }
//
//}
